package com.itheima.service.impl;

import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.dao.CheckGroupMapper;
import com.itheima.dao.CheckItemMapper;
import com.itheima.entity.PageResult;
import com.itheima.pojo.CheckGroup;
import com.itheima.pojo.CheckItem;
import com.itheima.service.CheckGroupService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @description:
 * @author: dalao
 * @date: 2020/4/6-19:00
 * @Version: 1.0.0
 */
@Service(interfaceClass = CheckGroupService.class)
@Transactional
public class CheckGroupServiceImpl implements CheckGroupService {
    @Autowired
    private CheckGroupMapper checkGroupMapper;
    @Autowired
    private CheckItemMapper checkItemMapper;

    @Override
    public void add(CheckGroup checkGroup) {
//        插入检查组信息并返回主键id
        checkGroupMapper.add(checkGroup);
        Integer checkGroupId = checkGroup.getId();
//        得到检查项id集合
        List<Integer> checkItemIds = checkGroup.getCheckItemIds();
        if (CollectionUtil.isNotEmpty(checkItemIds)){
            //循环与中间表建立关系
            for (Integer checkItemId:checkItemIds){
                //用循环与数据库交互次数多不好,需要和数据库只交互一次
                checkGroupMapper.setcheckGroupIdAndcheckItemIds(checkGroupId,checkItemId);
            }
        }
    }

    @Override
    public void addBatch(CheckGroup checkGroup) {
        //        插入检查组信息并返回主键id
        checkGroupMapper.add(checkGroup);
        Integer checkGroupId = checkGroup.getId();
//        得到检查项id集合
        List<Integer> checkItemIds = checkGroup.getCheckItemIds();
        if (CollectionUtil.isNotEmpty(checkItemIds)){
//            //循环与中间表建立关系
//            for (Integer checkItemId:checkItemIds){
//                //用循环与数据库交互次数多不好,需要和数据库只交互一次
//                checkGroupMapper.setcheckGroupIdAndcheckItemIds(checkGroupId,checkItemId);
//            }
            //一次批量传过去
            checkGroupMapper.setcheckGroupIdAndcheckItemIdsBatch(checkGroupId,checkItemIds);
       }
    }

    @Override
    public PageResult findPage(Integer currentPage, Integer pageSize, String queryString) {
//        调用工具类开始分页查询
        PageHelper.startPage(currentPage,pageSize);
//        通过mapper查询到列表的集合返回给Page
        Page<CheckGroup> checkGroups = checkGroupMapper.findPage(queryString);
        return new PageResult(checkGroups.getTotal(),checkGroups.getResult());
    }

    @Override
    public Map findById(Integer id) {
        //需要获取表单内容和检测项和已选的检测项
        //formData:表单数据
        CheckGroup checkGroup = checkGroupMapper.findGroupById(id);
        // tableData:新增和编辑表单中对应的检查项列表数据
        List<CheckItem> checkItems = checkItemMapper.findAll();
        // checkitemIds:新增和编辑表单中检查项对应的复选框，基于双向绑定可以进行回显和数据提交
        List<Integer> checkitemIds = checkGroupMapper.findCheckItemIdsById(id);
        Map map = new HashMap<>();
        map.put("checkGroup",checkGroup);
        map.put("checkItems",checkItems);
        map.put("checkitemIds",checkitemIds);
        return map;
    }

    @Override
    public void edit(CheckGroup checkGroup) {
        checkGroupMapper.edit(checkGroup);
        //获取检测项id集合
        List<Integer> checkItemIds = checkGroup.getCheckItemIds();
        //更新数据 , 需要将之前勾选的检测项删除, 也就是在中间表中删除关联关系
        checkGroupMapper.deleteAssociation(checkGroup.getId());

        //重新关联
        if(CollectionUtil.isNotEmpty(checkItemIds)) {
            checkGroupMapper.setcheckGroupIdAndcheckItemIdsBatch(checkGroup.getId(), checkItemIds);
        }
    }

    @Override
    public void delete(Integer id) {
        //删除应该先删除多表关联的中间表数据
        checkGroupMapper.deleteAssociation(id);
        checkGroupMapper.delete(id);
    }

    @Override
    public List<CheckGroup> findAll() {

        return checkGroupMapper.findAll();

    }

}
